﻿2026-05-10T14:38:55.1231705Z ##[group]Run pnpm verify:phase-4
2026-05-10T14:38:55.1232062Z [36;1mpnpm verify:phase-4[0m
2026-05-10T14:38:55.1255803Z shell: /usr/bin/bash -e {0}
2026-05-10T14:38:55.1256079Z env:
2026-05-10T14:38:55.1256334Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T14:38:55.1256863Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T14:38:55.1257285Z   SKIP_TRACE_CHECK: 1
2026-05-10T14:38:55.1257577Z ##[endgroup]
2026-05-10T14:38:55.4280160Z 
2026-05-10T14:38:55.4281319Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T14:38:55.4282288Z > node scripts/verify-phase-4.mjs
2026-05-10T14:38:55.4282884Z 
2026-05-10T14:38:55.4653629Z 
2026-05-10T14:38:55.4655037Z === Workspace: typecheck ===
2026-05-10T14:38:55.4655816Z >>> pnpm -r typecheck
2026-05-10T14:38:55.7702868Z Scope: 5 of 6 workspace projects
2026-05-10T14:38:55.7757158Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T14:38:55.7764937Z packages/db typecheck$ tsc --noEmit
2026-05-10T14:38:58.2342350Z packages/game-logic typecheck: Done
2026-05-10T14:38:58.2350617Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T14:39:00.4214424Z packages/db typecheck: Done
2026-05-10T14:39:01.8425820Z packages/protocol typecheck: Done
2026-05-10T14:39:01.8432706Z apps/client typecheck$ tsc --noEmit
2026-05-10T14:39:01.8435837Z apps/server typecheck$ tsc --noEmit
2026-05-10T14:39:13.6320017Z apps/client typecheck: Done
2026-05-10T14:39:14.7599610Z apps/server typecheck: Done
2026-05-10T14:39:14.7725488Z 
2026-05-10T14:39:14.7726441Z === Lint: protocol-sync ===
2026-05-10T14:39:14.7727152Z >>> pnpm lint:protocol-sync
2026-05-10T14:39:15.0918854Z 
2026-05-10T14:39:15.0920071Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T14:39:15.0921516Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T14:39:15.0922122Z 
2026-05-10T14:39:15.1271222Z lint-protocol-sync: OK
2026-05-10T14:39:15.1417910Z 
2026-05-10T14:39:15.1418941Z === Lint: game-logic-purity ===
2026-05-10T14:39:15.1419882Z >>> pnpm lint:game-logic-purity
2026-05-10T14:39:15.4533371Z 
2026-05-10T14:39:15.4534557Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T14:39:15.4535989Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T14:39:15.4536672Z 
2026-05-10T14:39:15.4871506Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T14:39:15.5014362Z 
2026-05-10T14:39:15.5017537Z === Lint: better-auth-schema-sync ===
2026-05-10T14:39:15.5018410Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T14:39:15.8150201Z 
2026-05-10T14:39:15.8151791Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:39:15.8153278Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T14:39:15.8154074Z 
2026-05-10T14:39:17.5052145Z lint-better-auth-schema-sync: OK
2026-05-10T14:39:17.5205630Z 
2026-05-10T14:39:17.5206315Z === Lint: rate-limit-budgets ===
2026-05-10T14:39:17.5206739Z >>> pnpm lint:rate-limit-budgets
2026-05-10T14:39:17.8226711Z 
2026-05-10T14:39:17.8227893Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T14:39:17.8228914Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T14:39:17.8229429Z 
2026-05-10T14:39:17.8547895Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T14:39:17.8691846Z 
2026-05-10T14:39:17.8692774Z === Lint: no-clipboard-rce ===
2026-05-10T14:39:17.8693512Z >>> pnpm lint:no-clipboard-rce
2026-05-10T14:39:18.1751907Z 
2026-05-10T14:39:18.1753074Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T14:39:18.1754046Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T14:39:18.1754544Z 
2026-05-10T14:39:18.2116778Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T14:39:18.2258440Z 
2026-05-10T14:39:18.2259300Z === Lint: room-layout ===
2026-05-10T14:39:18.2259919Z >>> pnpm lint:room-layout
2026-05-10T14:39:18.5319111Z 
2026-05-10T14:39:18.5320223Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T14:39:18.5321139Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T14:39:18.5322239Z 
2026-05-10T14:39:18.5715716Z lint-room-layout: OK
2026-05-10T14:39:18.5857596Z 
2026-05-10T14:39:18.5858416Z === ADR 0004 lint ===
2026-05-10T14:39:18.5858991Z >>> pnpm lint:adr:0004
2026-05-10T14:39:18.8879713Z 
2026-05-10T14:39:18.8880743Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T14:39:18.8882651Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T14:39:18.8883443Z 
2026-05-10T14:39:18.9250156Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:39:18.9383457Z 
2026-05-10T14:39:18.9384292Z === Drizzle: emit-check ===
2026-05-10T14:39:18.9385910Z >>> pnpm db:emit-check
2026-05-10T14:39:19.2411883Z 
2026-05-10T14:39:19.2413015Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T14:39:19.2416071Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T14:39:19.2418213Z 
2026-05-10T14:39:19.6942576Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T14:39:19.6944252Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T14:39:20.1718743Z 8 tables
2026-05-10T14:39:20.1719499Z accounts 8 columns 1 indexes 0 fks
2026-05-10T14:39:20.1720368Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T14:39:20.1723900Z characters 9 columns 0 indexes 1 fks
2026-05-10T14:39:20.1724968Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T14:39:20.1725873Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T14:39:20.1726727Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T14:39:20.1727542Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T14:39:20.1728280Z sessions 5 columns 0 indexes 1 fks
2026-05-10T14:39:20.1728745Z 
2026-05-10T14:39:20.1729628Z No schema changes, nothing to migrate 😴
2026-05-10T14:39:20.5249360Z 
2026-05-10T14:39:20.5250386Z === Drizzle: schema-sync ===
2026-05-10T14:39:20.5251203Z >>> pnpm lint:schema-sync
2026-05-10T14:39:20.8280718Z 
2026-05-10T14:39:20.8281879Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:39:20.8285492Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T14:39:20.8288103Z 
2026-05-10T14:39:20.8583300Z OK
2026-05-10T14:39:20.8730149Z 
2026-05-10T14:39:20.8731054Z === Drizzle: source-comments ===
2026-05-10T14:39:20.8731853Z >>> pnpm lint:source-comments
2026-05-10T14:39:21.1779988Z 
2026-05-10T14:39:21.1781224Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T14:39:21.1782585Z > pnpm -C packages/db run lint:source-comments
2026-05-10T14:39:21.1783206Z 
2026-05-10T14:39:21.4826157Z 
2026-05-10T14:39:21.4827446Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T14:39:21.4828676Z > node scripts/check-source-comments.mjs
2026-05-10T14:39:21.4829337Z 
2026-05-10T14:39:21.5165090Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T14:39:21.5415523Z 
2026-05-10T14:39:21.5416492Z === Workspace: test ===
2026-05-10T14:39:21.5417249Z >>> pnpm -r test
2026-05-10T14:39:21.8479854Z Scope: 5 of 6 workspace projects
2026-05-10T14:39:21.8533812Z packages/db test$ vitest run
2026-05-10T14:39:21.8543087Z packages/game-logic test$ vitest run
2026-05-10T14:39:22.3654160Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T14:39:22.3671711Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T14:39:22.7522796Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T14:39:22.9939764Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T14:39:23.2537352Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:39:23.3576966Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:39:23.4930470Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:39:23.5036531Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:39:23.5047137Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T14:39:23.5077134Z packages/game-logic test: [2m   Start at [22m 14:39:22
2026-05-10T14:39:23.5090718Z packages/game-logic test: [2m   Duration [22m 1.12s[2m (transform 159ms, setup 0ms, import 242ms, tests 46ms, environment 1ms)[22m
2026-05-10T14:39:23.5436239Z packages/game-logic test: Done
2026-05-10T14:39:23.5448814Z packages/protocol test$ vitest run
2026-05-10T14:39:23.5797327Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:39:24.0452681Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T14:39:24.3887044Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:39:24.3966723Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T14:39:24.4004124Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T14:39:24.4041883Z packages/db test: [2m   Start at [22m 14:39:22
2026-05-10T14:39:24.4066274Z packages/db test: [2m   Duration [22m 2.02s[2m (transform 171ms, setup 0ms, import 1.39s, tests 26ms, environment 0ms)[22m
2026-05-10T14:39:24.4321836Z packages/db test: Done
2026-05-10T14:39:24.4734968Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:39:24.6363743Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:39:24.8089149Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:39:24.9607354Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:39:24.9666593Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:39:24.9686181Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T14:39:24.9764434Z packages/protocol test: [2m   Start at [22m 14:39:24
2026-05-10T14:39:24.9767823Z packages/protocol test: [2m   Duration [22m 911ms[2m (transform 155ms, setup 0ms, import 290ms, tests 30ms, environment 0ms)[22m
2026-05-10T14:39:25.0095938Z packages/protocol test: Done
2026-05-10T14:39:25.0100422Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T14:39:25.0102949Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T14:39:25.5618955Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T14:39:25.6686963Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T14:39:26.6767203Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 53[2mms[22m[39m
2026-05-10T14:39:27.0757172Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-10T14:39:27.2528180Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T14:39:27.2531425Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T14:39:27.2771540Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 154[2mms[22m[39m
2026-05-10T14:39:27.3499200Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-10T14:39:27.6579863Z apps/server test: {"level":40,"time":1778423967650,"pid":3276,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:39:27.6633766Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:39:27.6734998Z apps/server test: {"level":40,"time":1778423967654,"pid":3276,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:39:27.6756504Z apps/server test: {"level":40,"time":1778423967654,"pid":3276,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:39:28.5028038Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T14:39:28.5523481Z apps/server test: {"level":30,"time":1778423968549,"pid":3301,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T14:39:28.5548105Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 666[2mms[22m[39m
2026-05-10T14:39:28.5586658Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 568[2mms[22m[39m
2026-05-10T14:39:29.4587418Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T14:39:29.4606468Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Y8DPhW/rebno.db
2026-05-10T14:39:29.4620218Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:39:29.4622457Z apps/server test: [run-migrations] OK
2026-05-10T14:39:29.4723933Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T14:39:29.4750035Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-wVJmiP/rebno.db
2026-05-10T14:39:29.4752966Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:39:29.4756502Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T14:39:29.4757836Z apps/server test: [run-migrations] OK
2026-05-10T14:39:29.4836800Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:39:29.5051082Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-9zDo0m/rebno.db
2026-05-10T14:39:29.5052939Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:39:29.5230007Z apps/server test: [run-migrations] OK
2026-05-10T14:39:29.5232616Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:39:29.5235774Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-9zDo0m/rebno.db
2026-05-10T14:39:29.5239050Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:39:29.5240801Z apps/server test: [run-migrations] OK
2026-05-10T14:39:29.5242396Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 56[2mms[22m[39m
2026-05-10T14:39:29.7548770Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T14:39:29.7937943Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:39:30.0646208Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:39:30.3643872Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T14:39:30.5943482Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:39:30.9744240Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 131[2mms[22m[39m
2026-05-10T14:39:31.4729647Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T14:39:31.4733704Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ custom filepath { path: '/custom/path/.env' }
2026-05-10T14:39:31.4735034Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T14:39:32.2085167Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 141[2mms[22m[39m
2026-05-10T14:39:32.2333356Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:39:32.2444522Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T14:39:32.2464588Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T14:39:32.2485890Z apps/server test: [2m   Start at [22m 14:39:25
2026-05-10T14:39:32.2496223Z apps/server test: [2m   Duration [22m 6.66s[2m (transform 518ms, setup 0ms, import 3.39s, tests 890ms, environment 2ms)[22m
2026-05-10T14:39:32.2875936Z apps/server test: Done
2026-05-10T14:39:32.9388722Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T14:39:33.7101893Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 78[2mms[22m[39m
2026-05-10T14:39:34.4292594Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:39:35.1318577Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:39:35.8433621Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:39:36.5431826Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T14:39:37.2160474Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:39:37.9048461Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:39:38.6328625Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:39:39.3336456Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:39:40.0163536Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:39:40.0401904Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T14:39:40.0417872Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T14:39:40.0419108Z apps/client test: [2m   Start at [22m 14:39:25
2026-05-10T14:39:40.0420874Z apps/client test: [2m   Duration [22m 14.37s[2m (transform 519ms, setup 43ms, collect 870ms, tests 626ms, environment 8.32s, prepare 1.60s)[22m
2026-05-10T14:39:40.1811550Z apps/client test: Done
2026-05-10T14:39:40.1928642Z 
2026-05-10T14:39:40.1929646Z verify-phase-4: OK (12 steps green)
